import axios from 'axios'
import { Message } from 'element-ui'

// 全局配置axios，处理所有axios请求
axios.interceptors.response.use(
  response => {
    // 检查响应中的业务状态码
    const res = response.data;
    console.log('全局响应拦截:', res);
    
    // 如果是blob类型，直接返回
    if (response.config.responseType === 'blob') {
      return response;
    }
    
    // 检查业务状态码
    if (res && res.code !== undefined && res.code !== 200) {
      // 显示错误消息
      Message({
        message: res.message || '操作失败',
        type: 'error',
        duration: 5 * 1000
      });
      
      // 对401特殊处理
      if (res.code === 401) {
        // 清除登录信息
        localStorage.removeItem('token');
        localStorage.removeItem('userRole');
        localStorage.removeItem('username');
        localStorage.removeItem('userId');
        
        // 跳转到登录页
        setTimeout(() => {
          location.href = '/login';
        }, 1000);
      }
      
      // 返回Promise.reject，让调用方知道请求失败
      return Promise.reject(res);
    }
    
    // 正常返回
    return response;
  },
  error => {
    console.error('请求错误:', error);
    Message({
      message: error.message || '请求失败',
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API || '/api', // url = base url + request url
  timeout: 5000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    console.log('请求URL:', config.url);
    
    // 注册和登录接口不需要添加token
    const noTokenUrls = ['/auth/register', '/auth/login', 'auth/register', 'auth/login'];
    const isNoTokenUrl = noTokenUrls.some(url => config.url.includes(url));
    
    console.log('是否为免token接口:', isNoTokenUrl);
    
    if (!isNoTokenUrl) {
    const token = localStorage.getItem('token')
    if (token) {
      // 让每个请求携带自定义token
      config.headers['Authorization'] = 'Bearer ' + token
        console.log('添加Authorization头:', config.headers['Authorization']);
      }
    } else {
      // 确保删除可能存在的Authorization头
      delete config.headers['Authorization'];
      console.log('已删除Authorization头');
    }
    
    return config
  },
  error => {
    // 对请求错误做些什么
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 如果是blob类型（文件下载），直接返回response
    if (response.config.responseType === 'blob') {
      return response.data
    }
    
    const res = response.data

    // 如果返回的状态码不是200，则判断为错误
    if (res.code !== 200) {
      // 显示后端返回的错误消息
      Message({
        message: res.message || res.msg || '系统错误',
        type: 'error',
        duration: 5 * 1000
      })

      // 401: 未登录或token过期
      if (res.code === 401) {
        // 重新登录
        localStorage.removeItem('token')
        localStorage.removeItem('userRole')
        localStorage.removeItem('username')
        localStorage.removeItem('userId')
        
        location.href = '/login'
      }
      return Promise.reject(res)
    } else {
      return res
    }
  },
  error => {
    console.log('请求错误:', error) // for debug
    
    // 检查是否有响应
    if (error.response) {
      console.log('错误状态码:', error.response.status);
      console.log('错误数据:', error.response.data);
      
      // 获取后端返回的错误信息
      const errorData = error.response.data;
      const errorMessage = errorData && errorData.message 
        ? errorData.message 
        : (error.message || '请求失败');
      
      // 针对401错误的特殊处理
      if (error.response.status === 401) {
        console.log('401未授权错误，请求路径:', error.config.url);
        
        // 如果是注册或登录接口，不跳转到登录页
        if (error.config.url.includes('/auth/register') || error.config.url.includes('/auth/login')) {
          Message({
            message: errorMessage,
            type: 'error',
            duration: 5 * 1000
          });
        } else {
          // 其他接口401则清除登录信息并跳转
          localStorage.removeItem('token')
          localStorage.removeItem('userRole')
          localStorage.removeItem('username')
          localStorage.removeItem('userId')
          
          Message({
            message: errorMessage || '登录已过期，请重新登录',
            type: 'error',
            duration: 5 * 1000
          });
          
          setTimeout(() => {
            location.href = '/login'
          }, 1000);
        }
      } else {
        // 显示后端返回的错误消息
        Message({
          message: errorMessage,
          type: 'error',
          duration: 5 * 1000
        });
      }
    } else {
      Message({
        message: error.message || '请求失败，请检查网络',
        type: 'error',
        duration: 5 * 1000
      });
    }
    
    // 返回经过处理的错误对象，包含后端错误信息
    if (error.response && error.response.data) {
      return Promise.reject({
        ...error,
        message: error.response.data.message || error.message
      });
    }
    return Promise.reject(error)
  }
)

export default service 